Send トレイトと Sync トレイト
from 項目17:状態共有並列実行には気を付けよう
スレッド間での利用に影響する 2 つの マーカトレイト がある
std::marker::Send: アイテム(T)を スレッド間で転送 可能ということを示す
アイテムの 所有権 は、スレッドからスレッドへ渡すことができる
std::marker::Sync: アイテムが 借用ルール 内で、複数スレッドから安全にアクセス可能ということを示す
言い換えると、&T がスレッド間で転送可能であることを示す
これらのトレイトは 自動トレイト で、新しい型の構成要素がすべて Send / Sync を実装していれば、コンパイラが自動的に実装してくれる
ほとんどの安全な型は実装しているので、実装していない型(impl !Sync for ...)に注目すると良い
https://doc.rust-lang.org/std/marker/trait.Sync.html#implementors
Send を実装していない型は、1 つのスレッド内でしか使えない
e.g. Rc<T>: 同期機構を持たない 参照カウントポインタ
実行速度を優先して、明示的に シングルスレッド を仮定している
マルチスレッド で動作させたい場合は、Arc<T> を用いれば良い
Sync を実装していない型は、複数のスレッドから 不変参照 を通じて安全にアクセスできない
e.g. Cell<T> / RefCell<T>: 同期せずに 内部可変性 を提供する
マルチスレッドで動作させたい場合は、Mutex<T> / RwLock<T> を用いて
また、*const T や *mut T などの 生ポインタ を表す型も Send と Sync を実装していない
項目34:FFI境界を通過するものを制御しよう
#Rust #Effective_Rust_―_Rustコードを改善し、エコシステムを最大限に活用するための35項目